知识点名称:SharedPreference

编号: K7-2

前驱知识点编号:K7-1,K1-1,K3-1,K4-1

作者:

讲义内容:

SharedPreferences适合保存配置参数等类型的数据,例如是否打开手机震动、是否开启Wifi等,这样的数据一般都是键-值对形式。

7.2.1 SharedPreferences简介

SharedPreferences本身是一个接口,提供了访问键-值对形式数据的方法。它还提供了两个内部嵌套接口:

  • interface SharedPreferences.Editor:该接口允许用户写入或修改键值对。

  • interface SharedPreferences.OnSharedPreferenceChangeListener:该接口定义了当键值对数据发生改变时的回调函数。这样当键值对发生改变时用户可以编写代码来进行响应。

SharedPreferences提供了如下方法来访问数据:

  • boolean contains(String key):检查SharedPreferences是否包含键为key的数据。

  • XXX getXXX(String key,XXX defValue):获得SharedPreferences中键为key的数据,如果不存在键为key的键值对,则返回默认值defValue。XXX为类型,可以为boolean,float,int,long,String等。

  • Map<String, ?> getAll():返回SharedPreferences所有的键值对。

  • SharedPreferences.Editor edit():新创建SharedPreferences.Editor实例并返回该实例。

SharedPreferences.Editor是SharedPreferences的内部接口。用户使用它可以写入或修改数据。

  • void apply():当编辑完后提交数据。该操作会修改SharedPreferences中的数据。

  • SharedPreferences.Editor clear():删除SharedPreferences中所有的数据。

  • boolean commit():当编辑完后提交数据,该操作会修改SharedPreferences中的数据。该方法和apply不同之处在于:commit是同步提交到磁盘上,而apply是将修改数据原子提交到内存,然后异步提交到磁盘上,这样当数据多次修改时,apply会直接覆盖内存中的数据,一定程度上提高了运行效率,但是apply没有返回值,也没有错误提示。一般建议使用aplly()提交修改。

  • SharedPreferences.Editor remove(String key):删除SharedPreferences中的键为key的键值对。

  • SharedPreferences.Editor putXXX(String key,XXX value):向SharedPreferences写入key-value键值对数据。

对于用户来说,不能够创建SharedPreferences实例,只能够通过getSharedPreferences(String name, int mode)来获得。该方法如下:

public abstract SharedPreferences getSharedPreferences (String name, int mode)

其中name为文件名,如果该文件不存在,getSharedPreferences()会自动在提交数据时创建该文件。mode为操作方式,有如下取值:

  • MODE_PRIVATE:SharedPreferences只能够被应用程序使用,为安全起见,推荐使用。

  • MODE_WORLD_READABLE:系统中所有程序都可以对SharedPreferences进行读操作。

  • MODE_WORLD_WRITEABLE:系统中所有程序都可以对SharedPreferences进行写操作。

显然MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE模式不安全,因此在Android 4.2(API 17)后已经不推荐使用。

从上面的分析可以看出,向SharedPreferences读数据一般步骤为:

1、 使用getSharedPreferences()通过获得SharedPreferences实例。

2.、使用SharedPreferences的getXXX(String key,XXX defValue)方法获得键key对应的值。

向SharedPreferences写数据的一般步骤为:

1、getSharedPreferences()通过获得SharedPreferences实例。

2、通过SharedPreferences.edit()方法获得SharedPreferences.Editor实例。

3、使用SharedPreferences.Editor的putXXX(String key,XXX value)写入键值对。

4、使用SharedPreferences.Editor的apply()或commit()提交数据,将数据写入到SharedPreferences中。

7.2.2 SharedPreferences演示

在下面的例子中,MainActivity有两个按钮,一个执行写操作,一个执行读操作。

public class MainActivity extends AppCompatActivity {

    //SharedPreferences文件名
    private final static String SharedPreferencesFileName="config";

    //键
    private final static String Key_UserName="UserName";//用户名
    private final static String Key_LoginDate="LoginDate";//登录时间 
    private final static String Key_UserType="UserType"; 

    SharedPreferences preferences; 
    SharedPreferences.Editor editor;

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main);

        //获得SharedPreferences实例
        preferences=getSharedPreferences(SharedPreferencesFileName, MODE_PRIVATE); 
        editor=preferences.edit();

        Button btnWrite=(Button)findViewById(R.id.ButtonWrite); 
        Button btnRead=(Button)findViewById(R.id.ButtonRead); 
        btnWrite.setOnClickListener(new View.OnClickListener() {
            @Override 
            public void onClick(View view) {
                //格式化日期,将日期按照年月日时分秒格式转换为字符串形式
                SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); 
                String strLoginDate = simpleDateFormat.format(new Date());
                //写入键值对 
                editor.putString(Key_UserName, "Zhang san"); 
                editor.putString(Key_LoginDate, strLoginDate); 
                editor.putInt(Key_UserType, 1);
                //提交修改,此处换成commit()也可以 
                editor.apply(); 
            } 
        });

        btnRead.setOnClickListener(new View.OnClickListener() { 
            @Override public void onClick(View view) {
                String strUserName = preferences.getString(Key_UserName, null); 
                String strLoginDate = preferences.getString(Key_LoginDate, null); 
                int nUserType=preferences.getInt(Key_UserType,0);
                if (strUserName != null && strLoginDate != null)
                    Toast.makeText(MainActivity.this, "用户名:" + strUserName + "登录时间:" + strLoginDate+"用户类型:"+
                        nUserType, Toast.LENGTH_LONG).show();
                else
                    Toast.makeText(MainActivity.this, "无数据", Toast.LENGTH_LONG).show();
             }
        });
    }
}

7.2.3 SharedPreferences存储位置

那么SharedPreferences存储在Android系统的什么地方呢?打开Android Device Monitor并切换到File Explorer,在\/data\/data\/<Package>\/shared_prefs\/目录可以看到刚才创建的config.xml文件,如下图所示: 

可以看到SharedPreferences是以XML文件格式存在的,可以点击工具栏上的“导出”将文件导出到计算机上,打开后可以看到文件内容如下:

<?xml version='1.0' encoding='utf-8' standalone='yes' ?> 
<map> 
    <string name="UserName">Zhang san</string> 
    <string name="LoginDate">
    <int name="UserType" value="1" />
</map>

可以清楚地看到,数据在SharedPreferences中以键值对形式存在。

results matching ""

    No results matching ""